/**
 * ---------递归-----------
 * 必要条件：
 * 1.将原问题划分成几个子问题，注意：子问题必须要与原问题的解法相同
 * 2.递归出口
 * 难点：递推公式的求法
 * 迭代->循环
 */
public class Stu6 {
    public static void main1(String[] args) {
        func(10);
    }
    public static void func(int a){
        if(a == 1)
            return;
        System.out.println(a);
        func(a-1);
    }
    //写一个递归的方法，输入一个非负整数，返回组成它的数字之和
    //例如： 输入 1729，则应该返回 1+7+2+9 它的和是19
    public static void main2(String[] args) {
        int a = fun(1729);
        System.out.println(a);
    }
    public static int fun(int x){
        if(x < 10) return x;
        return x%10+fun(x/10);
    }

    //斐波那契数列
    public static int fib(int n){
        if(n == 0) return 0;
        if(n == 1) return 1;
        return fib(n-1)+fib(n-2);
    }
    /**
     * 递归不一定非常好，对于斐波那契数列来说，有非常多重复的运算
     */
     public static int fib1(int n){
         if(n == 1 || n == 2) return 1;
         int f1 = 1,f2 = 1,f3 = 1;
         for(int i = 3;i<=n;i++){
             f3= f1 + f2;
             f1 = f2;
             f2 = f3;
         }
         return f3;
     }


    /**
     * ----------数组-------------
     * 数组是一块连续的内存，用来存储相同数据类型的数据
     * 每个数据 和 每个数据之间的关系是什么
     */
    public static void main3(String[] args) {
        //初始化数组有三种方法
        int[] array = {1,2,3,4};
        //int arrat2[] = {1,2,3,4}; 不建议这样的写法
        System.out.println(array.length); //直接求出数组的长度

        int[] array2 = new int[]{1,2,3,4};  //-》不要在中括号里面写任何的数值
        /**
         * new 关键字 一般来 new 对象
         * 数组就是一个对象
         * 在 java 中一切都是对象
         */
        int[] array3 = new int[10];
        //默认会将数组初始化，默认为 0
        //只要数组下标不是一个合法的范围就会出现数组越界的问题

        /**
         * 数组整体进行赋值的时候，只有一次机会
         * 那就是再定义的时候
         * int[] array = {1,2,3,4};
         */
    }

    public static void main4(String[] args) {
        int[] array = null; //局部变量
        System.out.println(array);
        /**
         * 变量中存的是地址
         * 把这个变量 引用变量 或者直接叫做引用
         */
    }

    public static void main(String[] args) {
        int[] array = {1,2,3,4};

        for(int i = 0;i<array.length;i++)
            System.out.print(array[i]+" ");
        System.out.println();

        //增强 for 循环 for-each
        for(int x: array){  //遍历这个数组的时候，把数组当中的元素
            System.out.print(x+" ");
        }
        System.out.println();
        /**
         * for 遍历数组的时候 是有下标的
         * for-each 没有下标
         */
    }

    /**
     * 基本数据类型   引用数据类型
     */

}
